/*
 * Gestion de l'historique de notre application.
 */
package ihmprojet.core.historique;

import java.util.EmptyStackException;
import java.util.NoSuchElementException;
import java.util.Stack;

/**
 * @author Nunes thomas <nds.thomas@gmail.com>
 * @author Rémi PIOTAIX <remi.piotaix@gmail.com>
 */
public class HistoriqueManager {

    private Stack<ActionInterface> historique = new Stack();
    private Stack<ActionInterface> histoAnnuler = new Stack();

    /**
     * Supprimer la derniére action.
     */
    public void annuler() {
        try {
            ActionInterface action = historique.pop();

            histoAnnuler.push(action);
            if (action.canReverse()) {
                action.reverse();
            } else {
                System.out.println("L'action ne peut être annulée.");
            }
        } catch (EmptyStackException e) {
            System.out.println("\nException annuler, la pile historique est vide.");
        }
    }

    /**
     * Retablie la derniére action annulée.
     */
    public void refaire() {
        try {
            ActionInterface action = this.histoAnnuler.pop();
            executer(action);
        } catch (EmptyStackException e) {
            System.out.println("\nException refaire, la pile Annuler est vide.");
        }
    }

    /**
     * Execute l'action en actualisant l'historique.
     *
     * @param action a ajouter à l'historique.
     */
    public void executer(ActionInterface action) {
        if (action.canExecute()) {
            action.execute();
            this.historique.push(action);
        } else {
            System.out.println("L'action ne peut être executée.");
        }
    }

    /**
     * Si il est possible d'annuler la derniére action.
     *
     * @return si derniere action annulable.
     */
    public boolean estAnnulable() {
        try {
            //On vérifie que la pile est non nulle avant d'y acceder.
            if (!this.historique.isEmpty()) {
                ActionInterface action = this.historique.firstElement();
                if (action != null) {
                    return action.canReverse();
                } else {
                    return false;
                }
            }
        } catch (NoSuchElementException e) {
            return false;
        }
        return false;
    }

    /**
     * Si derniére action peut être rétablie.
     *
     * @return si la derniere action peut être rétablie.
     */
    public boolean estRefeasable() {
        try {
            //On vérifie que la pile est non nulle avant d'y acceder.
            if (!this.histoAnnuler.isEmpty()) {
                ActionInterface action = (ActionInterface) this.histoAnnuler.firstElement();
                if (action != null) {
                    return action.canExecute();
                } else {
                    return false;
                }
            }
        } catch (NoSuchElementException e) {
            return false;
        }
        return false;
    }
}
